/*
 * TacticaCanoista.java
 *
 * Created on 31 de marzo de 2007, 20:52
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package futbol.tacticas.concursantes2007.Canoistas;

import futbol.General;
import futbol.tacticas.concursantes.Tactica;

import java.awt.*;
import java.util.Vector;
import futbol.tacticas.*;

/**
 *
 * @author canoista
 */
public class TacticaCanoista implements Tactica{
    
    private int nValores[][]={
        {-150,5,5},  // Jugador 1[0]
        {-100,30,4},  // Jugador 2[1]
        {-100,-30,4},  // Jugador 3[2]
        {0,0,4},  // Jugador 4[3]
        {-70,60,5},  // Jugador 5[4]
        {-70,-60,5},  // Jugador 6[5]
        {50,-40,6},  // Jugador 7[6]
        {50,40,6},  // Jugador 8[7]
        {100,-50,5},  // Jugador 9[8]
        {100,50,7},  // Jugador 10[9]
        {110,0,7}  // Jugador 11[10]
    };
    
    public Color getColor1() {
        return new Color(147,147,230);
    }

    public Color getColor2() {
        return new Color(173,235,248);
    }

    public Color getColorNumero() {
        return Color.black;
    }

    public String getNombre() {
        return "Canoistas";
    }

    public int getXInicial(int n) {
        return nValores[n][0];
    }

    public int getYInicial(int n) {
        return nValores[n][1];
    }

    public int getFuerza(int n) {
        return nValores[n][2];
    }
    
    
    
    
    public Vector<Comando> getComandos(SituacionJugadores sj) {
        Vector<Comando> com=new Vector();
        
        Point bola=sj.getBola();
        Point jugadores[]=sj.getMisJugadores();
        Point contrarios[]=sj.getContrario();    
               
        //Posicionamiento
        for (int n=0;n<11;n++)
            com.add(new ComandoIrA(n,nValores[n][0],nValores[n][1]));
        
        //Movimiento portero
        int y=(int)(bola.getY());
        if (y<-25) y=-25;
        if (y>25) y=25;
        double portX=nValores[0][0];
        if (bola.getX()<-140)
            portX=bola.getX();
        com.add(new ComandoIrA(0,portX, y));
              
        //Tiro de los defensas
        for (int n=0;n<5;n++)
            lanzarBolaMejor(sj, com);
        
        //Tiro de los delanteros
        for (int n=5;n<11;n++)
            com.add(new ComandoGolpearBola(n,165,SegunPortero(sj)));
        
        //Movimiento mas cercano a la bola
        int nJug=sj.getMasCercanoDeBola();
        com.add(new ComandoIrA(nJug,bola.getX(), bola.getY()));
        
        //Corre detras de la pelota
        for (int n=1;n<11;n++)
            if (General.getDistancia(bola.getX(),bola.getY(),nValores[n][0],nValores[n][1])<80)
                com.add(new ComandoIrA(n, bola.getX() , bola.getY()));
        
        
    return com;
    }
    
    private int SegunPortero(SituacionJugadores sj){
        int port=sj.getContrarioMasCerca(160,0);
        double portY=sj.getContrario()[port].getY();
        if (portY>0)
            return -15;
        else
            return 15;
    }
    
    private int heuristica(SituacionJugadores sj, int x, int y){
        int nHeu=y*5-x*100;
        Point jugadores[]=sj.getMisJugadores();
        for (int n=0;n<11;n++){
            int nDis=(int)(General.getDistancia(x,y,jugadores[n].getX(), jugadores[n].getY()));
            if (nDis<70)
                nHeu-=1000;
        }
        
        Point contrarios[]=sj.getContrario();
        for (int n=0;n<11;n++){
            int nDis=(int)(General.getDistancia(x,y,contrarios[n].getX(), contrarios[n].getY()));
            if (nDis<70)
                nHeu+=1000;
        }
        return nHeu;
    }
    
    private void lanzarBolaMejor(SituacionJugadores sj, Vector<Comando> com){
        Point bola=sj.getBola();
        int nHeuMejor=9999999;
        int xMej=0, yMej=0;
        int x=0, y=0, nHeu;
        for (int n=0;n<50;n++){
            x=(int)(Math.random()*340)-170;
            y=(int)(Math.random()*240)-120;
            nHeu=heuristica(sj,x,y);
            if (nHeuMejor>nHeu){
                nHeuMejor=nHeu;
                xMej=x;
                yMej=y;
            }
        }
        
        Point jugadores[]=sj.getMisJugadores();
        for (int n=0;n<11;n++){
            if (jugadores[n].getX()>50)
                com.add(new ComandoGolpearBola(n,165,SegunPortero(sj) ));
            else
                com.add(new ComandoGolpearBola(n,xMej, yMej));
                
        }
    }
}
